#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

int n,m,s,t,w;
vector<LL> edges[1503];
bool visit[1503],exist[1503];
LL ans[1503];

int main(){
	cin>>n>>m;
	if(n==1){
		cout<<0;
		return 0;
	}
	for(int i=1;i<=m;i++){
		cin>>s>>t>>w;
		edges[s].push_back(t);
		edges[s].push_back(w);
	}
	//BFS find exist
	memset(visit,false,sizeof(visit));
	visit[1]=true;
	queue<int> que;
	que.push(1);
	while(!que.empty()){
		int x=que.front();
		que.pop();
		int size=edges[x].size();
		for(int j=0;j<size;j+=2){
			int t=edges[x][j];
			if(!visit[t]){
				que.push(t);
				visit[t]=true;
			}
		}
	};
	//in
	int in[1503];
	memset(in,0,sizeof(in));
	for(int i=1;i<=n;i++){
		if(visit[i]){
			int size=edges[i].size();
			for(int j=0;j<size;j+=2){
				in[edges[i][j]]++;
			}
		}
	}
	//topni sort
	for(int i=1;i<=n;i++){
		ans[i]=LLONG_MIN;
	}
	que.push(1);
	ans[1]=0;
	while(!que.empty()){
		int size=que.size();
		for(int j=0;j<size;j++){
			int x=que.front();
			que.pop();
			int len=edges[x].size();
			for(int k=0;k<len;k+=2){
				int y=edges[x][k];
				if(visit[y]){
					in[y]--;
					ans[y]=max(ans[y],ans[x]+edges[x][k+1]);
					if(in[y]==0){
						que.push(y);
						if(y==n){
							cout<<ans[n];
							return 0;
						}
					}
				}
			}
		}
	}
	cout<<-1;
	return 0;
}
